package net.wangy.basiccode1.morenbao;
//继承、super、this、抽象类
public class AboutClass {
    /**
     * 继承：就是子类继承父类的属性和行为，使得子类对象具有与父类相同的属性、相同的行为。子类可以直接
     * 访问父类中的非私有的属性和行为
     *  好处：
     *  1. 提高代码的复用性。
     *  2. 类与类之间产生了关系，是多态的前提。
     *  方法重写：
     *  子类中出现与父类一模一样的方法时（返回值类型，方法名和参数列表都相同），会出现覆盖效
     *  果，也称为重写或者复写。声明不变，重新实现。
     *  注意事项
     *  1. 子类方法覆盖父类方法，必须要保证权限大于等于父类权限。
     *  2. 子类方法覆盖父类方法，返回值类型、函数名和参数列表都要一模一样。
     *
     *  继承后的构造方法：
     *  1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
     *  2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中，必须先执行父类的初始化动作。子类的构
     *  造方法中默认有一个 super() ，表示调用父类的构造方法，父类成员变量初始化后，才可以给子类使用。
     *  即父类空间优先于子类对象产生。
     *
     *  Java继承的特点：
     *  1. Java只支持单继承，不支持多继承。
     *  2. Java支持多层继承(继承体系)。
     *
     *  抽象类定义：
     *  父类中的方法，被它的子类们重写，子类各自的实现都不尽相同。那么父类的方法声明和方法主体，只有声明还有
     *  意义，而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定，包含抽象方法
     *  的类就是抽象类。抽象类不能创建对象。
     *  抽象方法：
     *  使用 abstract 关键字修饰方法，该方法就成了抽象方法，抽象方法只包含一个方法名，而没有方法体
     *  抽象的使用：
     *  继承抽象类的子类必须重写父类所有的抽象方法。否则，该子类也必须声明为抽象类。最终，必须有子类实现该父
     *  类的抽象方法，否则，从最初的父类到最终的子类都不能创建对象，失去意义。
     */
    public static void main(String[] args) {
        Zi zi = new Zi();
        //如果子类父类中出现不重名的成员变量，这时的访问是没有影响的。
        //如果子类父类中出现重名的成员变量，这时的访问是有影响的。
//        子父类中出现了同名的成员变量时，在子类中需要访问父类中非私有成员变量时，需要使用 super 关键字，修饰
//        父类成员变量，类似于之前学过的 this 。
        zi.show();
    }


}


//关于继承
class Fu {
    // Fu中的成员变量。
    int num = 5;
    int a= 11;
}

class Zi extends Fu {// Zi中的成员变量
    int num2 = 6;
    int a=22;
    // Zi中的成员方法
    public void show() {
        System.out.println("-----父子类中变量未重名的情况：----------------");
// 访问父类中的num，
        System.out.println("Fu num="+num); // 继承而来，所以直接访问。
// 访问子类中的num2
        System.out.println("Zi num2="+num2);
        System.out.println("---------父子类中重名的情况(直接访问的是子类的变量):-----------");
        System.out.println("直接访问重名变量："+a);
        System.out.println("-------非最直接，而是采用super和this关键字--------");
        System.out.println("父类a变量的值："+super.a);
        System.out.println("子类a变量的值：" +this.a);

    }
}